package $14_objecttransform2;

/*
多态的优点：可以使用子类的重写的方法，使方法更加灵活
多态的弊端：无法使用子类特有的成员
如果想使用子类特有的成员，就需要向下转型。
子类 对象名 = (子类)父类对象a;  这样可以把父类对象a转换成子类对象*/
public class DownTransform 
{
	public static void main(String[]args)
	{
		
		Dog d = new Dog();
		useAnimal(d);
		/*Cat c = new Cat();
		useAnimal(c);  // 这里报错。因为c是Cat里的对象无法向下转型成Dog类的对象*/
		//改动后
		Cat c = new Cat();
		useAnimal2(c);
		
		
	}
	public static void useAnimal(Animal ani)
	{
		ani.shout();
		System.out.println("-----------------------------------------------");
		//ani.show();  // 这里报错了，父类声明引用子类对象无法调用子类特有的方法，但可以类型强转后再调用
		//现在将ani向下转型，再重新调用show方法
		Dog dog = (Dog)ani;
		dog.show();
	}
	
	//复制一下useAnimal,再用instanceof语句改动一下
	public static void useAnimal2(Animal ani)
	{
		ani.shout();
		System.out.println("-----------------------------------------------");
		//ani.show();  // 这里报错了，父类声明引用子类对象无法调用子类特有的方法，但可以类型强转后再调用
		//现在将ani向下转型，再重新调用show方法
		if(ani instanceof Dog) 
		{
			Dog dog = (Dog)ani;
			dog.show();
		}
	}
}




abstract class Animal
{
	public abstract void shout();
}


class Dog extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("汪汪汪");
	}
	//写一个Dog特有的成员方法show()
	public void show()
	{
		System.out.println("one one one");
	}
}


class Cat extends Animal
{
	//shout()重写
	public void shout()
	{
		System.out.println("喵喵喵");
	}
}
